namespace Digitalmes.Domain.Entities.Mes.Processes;

/// <summary>
/// 工艺步骤（工序级别）
/// </summary>
[SugarTable("proc_routing_step")]
public sealed class ProcRoutingStep : AuditedEntity
{
    /// <summary>
    /// 关联的工艺路线 Id
    /// </summary>
    public long RoutingId { get; set; }

    /// <summary>
    /// 关联的工序 Id
    /// </summary>
    public long OperationId { get; set; }

    /// <summary>
    /// 关联的工序
    /// </summary>
    [Navigate(NavigateType.OneToOne, nameof(OperationId))]
    public ProcOperation? Operation { get; set; }

    /// <summary>
    /// 步骤顺序号
    /// </summary>
    public int Seq { get; set; }

    /// <summary>
    /// 是否允许重复进站。
    /// </summary>
    public bool AllowRepeat { get; set; }

    /// <summary>
    /// 是否是关键工序（true->必须；false->忽略）。
    /// </summary>
    /// <remarks>
    /// 关键工序产品必过点，进入工序前会校验上一个工序（非首站），若是关键工序必须有过站记录（是否良品过站取决于 <see cref="IsMustGood"/> 设置）；
    /// 非关键工序产品可以跳站。
    /// </remarks>
    public bool IsCritical { get; set; }

    /// <summary>
    /// 在有启用 <see cref="IsCritical"/> 的前提下，是否还校验此产品必须是良品过站。
    /// </summary>
    public bool IsMustGood { get; set; }

    /// <summary>
    /// 在过站前是否检查物料
    /// </summary>
    public bool IsCheckMaterial { get; set; }

    /// <summary>
    /// 策略集合，根据不同策略做不同动作（可作为规则的扩展）。
    /// </summary>
    [SugarColumn(IsJson = true)]
    public List<string>? Policies { get; set; } = [];

    /// <summary>
    /// 工序标准作业时间（单位：秒）
    /// </summary>
    public int StandardTime { get; set; }

    /// <summary>
    /// 是否检查工艺标准。
    /// </summary>
    /// <remarks>
    /// 在工艺步骤中设定工艺标准，可以将多个工步操作用一套标准设置（如此工序中有多组相同的拧紧工艺，可用工艺步骤设定一套标准即可，不需要再细分到具体工步上做一对一设定）。
    /// 此设置不影响工步设定。
    /// </remarks>
    public bool IsCheckStandard { get; set; }

    /// <summary>
    /// 电子操作指导文档名称（存储格式为：[指定目录]/[产线]/[工序]/[产品]/[文件]）
    /// </summary>
    public string? Esop { get; set; }

    /// <summary>
    /// 步骤操作说明
    /// </summary>
    public string? StepInstruction { get; set; }

    /// <summary>
    /// 前置步骤 ID，首部为 null。
    /// </summary>
    public long? PrevStepId { get; set; }

    /// <summary>
    /// 后续步骤 ID，尾部为 null。
    /// </summary>
    public long? NextStepId { get; set; }

    /// <summary>
    /// 产品用料。
    /// </summary>
    [NotNull]
    [Navigate(NavigateType.OneToMany, nameof(ProcStepMaterial.StepId))]
    public List<ProcStepMaterial>? Materials { get; set; }

    /// <summary>
    /// 包含的工艺标准集合。
    /// </summary>
    [NotNull]
    [Navigate(NavigateType.OneToMany, nameof(ProcStepStandard.StepId))]
    public List<ProcStepStandard>? Standards { get; set; }
}
